介紹
組合模式將多個物件組成樹狀結構(tree),並讓使用者透過單一介面來操作這些組合物件。
C++範例
#include <iostream>
#include <memory>
#include <vector>
class Sprite
{
public:
virtual void ShowName() const = 0;
virtual ~Sprite() {}
};
class Monster : public Sprite
{
public:
void ShowName() const
{
std::cout << "monster" << std::endl;
}
};
class CompositeSprite : public Sprite
{
public:
void ShowName() const
{
for (std::shared_ptr<Sprite> s : m_SpriteList)
{
s->ShowName();
}
}
void AddSprite(std::shared_ptr<Sprite> spSprite)
{
m_SpriteList.push_back(spSprite);
}
private:
std::vector<std::shared_ptr<Sprite>> m_SpriteList;
};
int main()
{
// 創建三個怪物物件
const std::shared_ptr<Monster> monster1 = std::make_shared<Monster>();
const std::shared_ptr<Monster> monster2 = std::make_shared<Monster>();
const std::shared_ptr<Monster> monster3 = std::make_shared<Monster>();
// 創建可含其他怪物容器的容器
const std::shared_ptr<CompositeSprite> sprite1 = std::make_shared<CompositeSprite>();
// 創建怪物容器
const std::shared_ptr<CompositeSprite> sprite2 = std::make_shared<CompositeSprite>();
const std::shared_ptr<CompositeSprite> sprite3 = std::make_shared<CompositeSprite>();
// 將怪物物件加入怪物容器
sprite2->AddSprite(monster1);
sprite2->AddSprite(monster2);
sprite3->AddSprite(monster3);
// 將怪物容器加入怪物容器
sprite1->AddSprite(sprite2);
sprite1->AddSprite(sprite3);
// 印出怪物資訊 (內部會一層層印出怪物資訊)
sprite1->ShowName();
return 0;
}
Output:
monster
monster
monster